package fr.uniscol.dao.impl;

import java.util.List;

import org.springframework.stereotype.Repository;

import fr.uniscol.dao.IEnseignantDao;
import fr.uniscol.dao.UniscolDaoSupport;
import fr.uniscol.dao.mapper.EnseignantRowMapper;
import fr.uniscol.dao.mapper.ServiceEnseignantRowMapper;
import fr.uniscol.model.BaseAnneeScolaire;
import fr.uniscol.model.Enseignant;
import fr.uniscol.model.ServiceEnseignant;

import static fr.uniscol.dao.impl.SQLNames.*;

@Repository("enseignantDao")
public class EnseignantDaoImpl extends UniscolDaoSupport implements IEnseignantDao {

	@Override
	public List<Enseignant> getAllEnseignantsOfEtablissement(BaseAnneeScolaire base) {
		
		List<Enseignant> enseignants = getJdbcTemplate().query("SELECT * FROM " + TABLE_ENSEIGNANT + " WHERE baseid=? ", new Object[]{
				base.getId()
		}, new EnseignantRowMapper(base));
		
		return enseignants;
	}

	@Override
	public Enseignant getEnseignantById(long enseignantId) {
		
		Enseignant enseignant = (Enseignant) getJdbcTemplate().queryForObject("SELECT * FROM " + TABLE_ENSEIGNANT + " WHERE enseignantid=? ", new Object[]{
				enseignantId
		}, new EnseignantRowMapper());
		
		return enseignant;
	}

	@Override
	public List<ServiceEnseignant> getServicesOfEnseignant(Enseignant enseignant) {
		
		List<ServiceEnseignant> services = getJdbcTemplate().query("SELECT s.*, cl.libelle libelle_structure, m.libelle_long libelle_matiere " +
                                                                            "FROM " + TABLE_SERVICE_ENSEIGNANT + " s, " + TABLE_MATIERE + " m, " + TABLE_STRUCTURE + " cl " +
                                                                            "WHERE s.enseignantid=? " +
                                                                            "AND s.structureid=cl.structureid " +
                                                                            "AND s.matiereid=m.matiereid ", new Object[]{
			enseignant.getId()
		}, new ServiceEnseignantRowMapper());
		
		return services;
	}

    @Override
    public long saveEnseignant(Enseignant enseignant) {
        
        long enseignantId = 0;
        
        if(enseignant.getId() == 0){
            
            int nbRowsAffected = getJdbcTemplate().update("INSERT INTO " + TABLE_ENSEIGNANT + " (baseid, nom, prenom, id_siecle) VALUES(?, ?, ?, ?)", new Object[]{
               enseignant.getBase().getId(),
               enseignant.getNom(),
               enseignant.getPrenom(),
               enseignant.getIdSiecle()
            });
            
            if(nbRowsAffected != 1){
                enseignantId = 0;
            }else{
                enseignantId = getJdbcTemplate().queryForObject("SELECT LAST_INSERT_ID()", Long.class);
            }
            
        }else{
            
            int nbRowsAffected = getJdbcTemplate().update("UPDATE " + TABLE_ENSEIGNANT + " SET nom=?,prenom=?,id_siecle=? WHERE enseignantid=?", new Object[]{
               enseignant.getNom(),
               enseignant.getPrenom(),
               enseignant.getIdSiecle(),
               enseignant.getId()
            });
            
            enseignantId = enseignant.getId();
        }
        
        return enseignantId;
    }

    @Override
    public boolean deleteEnseignant(Enseignant enseignant) {
        
        int nbRowsAffected = getJdbcTemplate().update("DELETE FROM " + TABLE_ENSEIGNANT + " WHERE enseignantid=?", new Object[]{
            enseignant.getId()
        });
        
        return nbRowsAffected == 1;
    }
}
